<?php
namespace Common\Model;

class PayLogModel extends Model {
    protected $tableName = 'pay_log';
    protected $pk        = 'p_l_id';

    /**
     * buildSearchExpr 
     * 组装查询条件
     * 
     * @param mixed $d  查询数据，一般来源于$_GET或$_POST
     * @param mixed $field  可查询的字段对照表，其结构为array(array('表单项目名称' => '数据库字段名称'))
     * @access public
     * @return void 返回值为数组，参见方法内部注释
     */
    public function buildSearchExpr($d, $field = NULL) {
        $expr = array();
        $dao  = array();
        $sortExpr = 'p_l_id DESC';

        /**
         * 下标为表单中的项目名称，值为数据库中表的字段名称 
         */
        if(empty($field)) {
            $field = array(
                'uid'         => 'uid',
                'user_name'   => 'user_name',
                'p_l_add_date' => 'p_l_add_date',
                'p_l_clearing' => 'p_l_clearing',
                'p_l_status' => 'p_l_status',
                'siter_status' => 'status', //站长状态
                'bank' => 'bank',
            );
        }

        foreach($field as $k => $v) {
            $val = isset($d[$k]) ? trim($d[$k]) : '';

            if(strlen($val) < 1) {
                continue;
           }

            switch($k) {
                case 'user_name' :
                    $expr[$v] = array('EXP', "LIKE '%{$val}%'");
                    break;

                default:
                    $expr[$v] = $d[$k];
            }

            $dao[$k] = $d[$k];
        }

        /**
         * 处理多个查询项目合并到一起，然后只能选一项查询的情况
         * 保存到$dao中，用于回填至查询表单
         */
        foreach($d as $k => $v) {
            if(substr($k, 0, 12) == 'search_item_') {
                $dao[$k] = $v;
            }
        }

        /**
         * 因为部分查询会涉及到视图，所以需要在下面指定完整的可排序字段
         */
        $sortField = array('uid', 'user_name', 'p_l_add_date', 'status', 'p_l_money', 'p_l_real_money', 'p_l_pay_money');

        if(!empty($d['sort']) && in_array($d['sort'], $sortField)) {
            $sortdir = empty($d['sortdir'])                     ? 'DESC'   : strtoupper($d['sortdir']);
            $sortdir = in_array($sortdir, array('DESC', 'ASC')) ? $sortdir : 'DESC';

            $sort     = $d['sort'];
            $sortExpr = "{$sort} {$sortdir}";

            $dao['sort']    = $sort;
            $dao['sortdir'] = $sortdir;
        }

        return array(
            'expr' => $expr,            //ThinkPHP查询条件表达式
            'sort' => $sortExpr,        //排序表达式
            'json' => json_encode($dao) //用于回填至查询表单的数据
        );
    }

    public function save2($d) {
        if(empty($d['p_l_id'])) {
            throw new ThinkException('没有编号，无法保存数据');
        }

        if(isset($d['p_l_status'])) {
            $d['p_l_status'] = (int)$d['p_l_status'];
            $payTime = $d['p_l_status'] == 1 ? date('Y-m-d H:i:s') : null;
            $d['p_l_pay_time'] = $payTime;

            if(!$d['p_l_status']) {
                $d['p_l_comment'] = null;
            }
        }

        /**
         * 如果$d中元素少于两个，说明没有数据需要保存
         */
        if(count($d) < 2) {
            return true;
        }

        if(isset($d['p_l_scale']) && empty($d['p_l_scale'])) {
            throw new ThinkException('请输入实付比例');
        }

        if(isset($d['p_l_pay_money']) && empty($d['p_l_pay_money'])) {
            throw new ThinkException('请输入实付金额');
        }

        if(!empty($d['p_l_pay_money'])) {
            $d['p_l_pay_money'] = bcadd($d['p_l_pay_money'], 0, 2); //让所有实付金额后都有两位小数，即使结果为整数，那么小数部分为两个零
        }

        if(isset($d['p_l_comment']) && isset($d['p_l_status']) && empty($d['p_l_comment'])) {
            $d['p_l_comment'] = (int)$d['p_l_status'] ? C('PAY_LOG_DEFAULT_COMMENT') : null;
        }

        $d['p_l_operator'] = C('RUN_LOGIN_USER.user_name');

        //Todo:过滤p_l_comment，防止注入或xss

        return $this->save($d);
    }

    /**
     * del
     *
     * @param mixed $id
     * @return void
     */
    public function del($id) {
        $id = (int)$id;

        if(!$record = $this->getByZoneId($id)) {
            return true;
        }

        $expr = array(
            'day'     => date('Y-m-d'),
            'uid'     => $record['uid'],
            'zone_id' => $id,
        );
        $mZoneStats = D2('ZoneStats');

        if($mZoneStats->where($expr)->find()) {
            throw new ThinkException('此广告位今天已经有计费数据，无法删除');
        }

        $expr = array(
            'zone_id' => $id,
        );

        return $this->where($expr)->delete();
    }


    /**
     * _options_filter()中设置的有条件，所以在Model::save()方法中不会再设置以主键为条件
     */
    protected function _before_update(&$data, &$options) {
        if(!isset($data[$this->getPk()])) {
            return false;
        }

        if(isset($options['where']) && !array_key_exists($this->getPk(), $options['where'])) {
            $options['where'][$this->getPk()] = $data[$this->getPk()];
        }

        return true;
    }

    protected function _options_filter(&$options) {
        if(!$loginUser = C('RUN_LOGIN_USER')) {
            exit('NO LOGIN');
        }

        if($loginUser['type'] == 1) {
            $options['where']        = isset($options['where']) ? $options['where'] : array();
            $options['where']['uid'] = $loginUser['uid'];

            return true;
        }
    }

}
